home *** CD-ROM | disk | FTP | other *** search
/ EnigmA Amiga Run 1996 June / EnigmA AMIGA RUN 08 (1996)(G.R. Edizioni)(IT)[!][issue 1996-06][EARSAN CD VII].iso / earcd / utilsys / rss14gmd.lha / RSys_1.4gmd / C / Modify.c < prev    next >
C/C++ Source or Header  |  1996-05-04  |  24KB  |  1,108 lines

  1. /*
  2.    ***************************************************************************
  3.    *
  4.    * Datei:
  5.    *      RSysModify.c
  6.    *
  7.    * Inhalt:
  8.    *
  9.    *      --- Globale Routinen ---
  10.    *
  11.    *    int CheckWindow ( WINDOW *findwin );
  12.    *    void CountAssocObjects ( TASK *task , int *wins , int *scrs , int *ports );
  13.    *    void ModifyObject ( int TypeID , ULONG code );
  14.    *
  15.    *      --- Lokale  Routinen ---
  16.    *
  17.    *    static BOOL CheckObject ( LIST *list , RSYS_Objid *obj );
  18.    *    static BOOL CheckTask ( RSYS_Objid *obj );
  19.    *    static int CheckScreen ( SCREEN *findscr );
  20.    *    static int OpenChgPriWindow ( void );
  21.    *    static MSGPORT *TaskPort ( TASK *task );
  22.    *    static WINDOW *TaskWindow ( TASK *task );
  23.    *    static void ChangePri ( RSYS_Objid *obj );
  24.    *    static void ClosingScreens ( SCREEN *scr );
  25.    *    static void ClosingWindows ( WINDOW *wind );
  26.    *    static void DisplayAllFonts ( int TypeID , NODE *ClickedNode );
  27.    *    static void DisplayResource ( int TypeID , RSYS_Objid *obj );
  28.    *    static void DisplaySoftDevice ( int TypeID , RSYS_Objid *obj );
  29.    *    static void DisplayTreeDevice ( int TypeID , RSYS_Objid *obj );
  30.    *    static void FlushLibrary ( RSYS_Objid *obj );
  31.    *    static void KillTask ( RSYS_Objid *obj );
  32.    *    static void ModifyFont ( int TypeID , RSYS_Objid *obj );
  33.    *    static void ModifyLibrary ( int TypeID , RSYS_Objid *obj );
  34.    *    static void ModifyPort ( int TypeID , RSYS_Objid *obj );
  35.    *    static void ModifyScreen ( int TypeID , RSYS_Objid *obj );
  36.    *    static void ModifyTask ( int TypeID , RSYS_Objid *obj );
  37.    *    static void ModifyVolumeLock ( int TypeID , RSYS_Objid *obj );
  38.    *    static void ModifyWindow ( int TypeID , RSYS_Objid *obj );
  39.    *    static void RemoveFontSafely ( TEXTFONT *tf );
  40.    *    static void RemovePortSafely ( MSGPORT *p , RSYS_Objid *obj );
  41.    *    static void SignalTask ( RSYS_Objid *obj , ULONG signal );
  42.    *
  43.    * Bemerkungen:
  44.    *      Enthält die Routinen zum Modifizieren von Objekten.
  45.    *
  46.    * Erstellungsdatum:
  47.    *      07-Jan-93     Rolf Böhme
  48.    *
  49.    * Änderungen:
  50.    *      07-Jan-93     Rolf Böhme        Erstellung
  51.    *
  52.    ***************************************************************************
  53.  */
  54.  
  55. #include "RSys.h"
  56. #include "protos.h"
  57.  
  58. static void KillTask (RSYS_Objid *);
  59. static int modified = FALSE;
  60.  
  61.  /*
  62.   * CheckObject() prüft, ob ein ausgewähltes Listenelement (Objekt)
  63.   * sich noch in der Liste befindet
  64.   */
  65. static BOOL
  66. CheckObject (LIST * list, RSYS_Objid * obj)
  67. {
  68.   NODE *node;
  69.   BOOL retval;            /*GMD */
  70.   Forbid ();
  71.  
  72.   for (node = list->lh_Head; node->ln_Succ && (node != obj->address); node = node->ln_Succ);
  73.  
  74.   Permit ();
  75.  
  76.   retval = ((node == obj->address) ? TRUE : FALSE);
  77.   return retval;
  78. }
  79.  
  80.  /*
  81.   * CheckTask() prüft, ob ein Task-Objekt sich noch in den Listen
  82.   * befindet, also noch existiert
  83.   */
  84. static BOOL
  85. CheckTask (RSYS_Objid * obj)
  86. {
  87.   if (CheckObject (&(SysBase->TaskWait), obj) || CheckObject (&(SysBase->TaskReady), obj) ||
  88.       ((TASK *) obj->address == FindTask (NULL)))
  89.     return (TRUE);
  90.   else
  91.     return (FALSE);
  92. }
  93.  
  94.  /*
  95.   * CountAssocObjects() zählt die zu einem Task gehörenden
  96.   * Windows, Screens und Ports
  97.   */
  98. void
  99. CountAssocObjects (TASK * task, int *wins, int *scrs, int *ports)
  100. {
  101.   ULONG lock;
  102.   WINDOW *win;
  103.   SCREEN *scr;
  104.   MSGPORT *port;
  105.   NODE *node;
  106.  
  107.   DPOS;
  108.  
  109.   Forbid ();
  110.  
  111.   lock = LockIBase (NULL);
  112.  
  113.   for (scr = IntuitionBase->FirstScreen; scr; scr = scr->NextScreen)
  114.     for (win = scr->FirstWindow; win; win = win->NextWindow)
  115.       {
  116.     if (win->UserPort && win->UserPort->mp_SigTask &&
  117.         (win->UserPort->mp_SigTask == task))
  118.       {
  119.         (*wins)++;
  120.  
  121.         if ((scr->Flags & CUSTOMSCREEN) && NOT (scr->Flags & PUBLICSCREEN))
  122.           (*scrs)++;
  123.       }
  124.       }
  125.  
  126.   UnlockIBase (lock);
  127.  
  128.   for (node = SysBase->PortList.lh_Head; node->ln_Succ; node = node->ln_Succ)
  129.     {
  130.       port = (MSGPORT *) node;
  131.  
  132.       if (port->mp_SigTask && (port->mp_SigTask == task))
  133.     (*ports)++;
  134.     }
  135.  
  136.   Permit ();
  137.  
  138.   return;
  139. }
  140.  
  141.  /*
  142.   * CheckWindow() prüft, ob ein Fenster noch existiert, und zwar
  143.   * auf allen Screens
  144.   */
  145. int
  146. CheckWindow (WINDOW * findwin)
  147. {
  148.   ULONG lock;
  149.   WINDOW *win;
  150.   SCREEN *scr;
  151.   int ret = FALSE;
  152.  
  153.   DPOS;
  154.  
  155.   lock = LockIBase (NULL);
  156.  
  157.   for (scr = IntuitionBase->FirstScreen; scr && NOT (ret); scr = scr->NextScreen)
  158.     for (win = scr->FirstWindow; win && NOT (ret); win = win->NextWindow)
  159.       if (win == findwin)
  160.     ret = TRUE;
  161.  
  162.   UnlockIBase (lock);
  163.  
  164.   return ret;
  165. }
  166.  
  167.  /*
  168.   * CheckScreen() prüft, ob ein Screen noch existiert
  169.   */
  170. static int
  171. CheckScreen (SCREEN * findscr)
  172. {
  173.   ULONG lock;
  174.   SCREEN *scr;
  175.   int ret = FALSE;
  176.  
  177.   lock = LockIBase (NULL);
  178.  
  179.   for (scr = IntuitionBase->FirstScreen; scr && NOT (ret); scr = scr->NextScreen)
  180.     if (scr == findscr)
  181.       ret = TRUE;
  182.  
  183.   UnlockIBase (lock);
  184.  
  185.   return ret;
  186. }
  187.  
  188.  /*
  189.   * TaskPort() sucht in der Liste der öffentlichen Ports
  190.   * nach dem ersten Port, der den Task task als Signaltask
  191.   * hat
  192.   */
  193. static MSGPORT *
  194. TaskPort (TASK * task)
  195. {
  196.   MSGPORT *taskport = NULL, *port;
  197.   NODE *node;
  198.  
  199.   Forbid ();
  200.  
  201.   for (node = SysBase->PortList.lh_Head; node->ln_Succ; node = node->ln_Succ)
  202.     {
  203.       port = (MSGPORT *) node;
  204.  
  205.       if (port->mp_SigTask && (port->mp_SigTask == task))
  206.     {
  207.       taskport = port;
  208.       break;
  209.     }
  210.     }
  211.  
  212.   Permit ();
  213.  
  214.   return taskport;
  215. }
  216.  
  217.  /*
  218.   * TaskWindow() sucht in der IntuitionBase nach dem ersten Fenster,
  219.   * dessen UserPort zu dem Task task gehört
  220.   */
  221. static WINDOW *
  222. TaskWindow (TASK * task)
  223. {
  224.   ULONG lock;
  225.   WINDOW *win, *taskwindow = NULL;
  226.   SCREEN *scr;
  227.  
  228.   lock = LockIBase (NULL);
  229.  
  230.   for (scr = IntuitionBase->FirstScreen; scr && NOT (taskwindow); scr = scr->NextScreen)
  231.     for (win = scr->FirstWindow; win && NOT (taskwindow); win = win->NextWindow)
  232.       if (win->UserPort && (win->UserPort->mp_SigTask) && (win->UserPort->mp_SigTask == task))
  233.     taskwindow = win;
  234.  
  235.   UnlockIBase (lock);
  236.  
  237.   return taskwindow;
  238. }
  239.  
  240.  /*
  241.   * ClosingWindows() schließt ein Fenster auf sicherste
  242.   * Weise, wie ich hoffe...
  243.   */
  244. static void
  245. ClosingWindows (WINDOW * wind)
  246. {
  247.   if (CheckWindow (wind))
  248.     {
  249.       if ((wind->ReqCount != 0) && wind->FirstRequest)
  250.     while (wind->ReqCount != 0)
  251.       EndRequest (wind->FirstRequest, wind);
  252.  
  253.       if (wind->DMRequest)
  254.     ClearDMRequest (wind);
  255.       if (wind->Pointer)
  256.     ClearPointer (wind);
  257.       if (wind->MenuStrip)
  258.     ClearMenuStrip (wind);
  259.  
  260.       CloseWindow (wind);
  261.     }
  262.   else
  263.     ErrorHandle ("CheckWindow()", WINDOW_ERR, FIND_FAIL, NO_KILL);
  264.  
  265.   return;
  266. }
  267.  
  268.  /*
  269.   * ClosingScreens() schließt einen Screen auf sicherste
  270.   * Weise, wie ich hoffe...
  271.   */
  272. static void
  273. ClosingScreens (SCREEN * scr)
  274. {
  275.   WINDOW *win = scr->FirstWindow, *markwin;
  276.  
  277.   if (CheckScreen (scr))
  278.     {
  279.       while (win)
  280.     {
  281.       markwin = win->NextWindow;
  282.       ClosingWindows (win);
  283.       win = markwin;
  284.     }
  285.  
  286.       CloseScreen (scr);
  287.  
  288.       if (CheckScreen (scr))
  289.     PrintInfo ("Screen not killed!", SPEAK, SEC);
  290.     }
  291.   else
  292.     ErrorHandle ("CheckScreen", SCREEN_ERR, FIND_FAIL, NO_KILL);
  293.  
  294.   return;
  295. }
  296.  
  297.  /*
  298.   * RemovePortSavely() entfernt eine Port auf sicherste Weise
  299.   */
  300. static void
  301. RemovePortSafely (MSGPORT * p, RSYS_Objid * obj)
  302. {
  303.   NODE *MsgNode;
  304.   MSGPORT *port;
  305.  
  306.   port = (obj ? (MSGPORT *) obj->address : p);
  307.  
  308.   Forbid ();
  309.  
  310.   if (NOT (IsMsgPortEmpty (port)))
  311.     {
  312.       MsgNode = port->mp_MsgList.lh_Head;
  313.  
  314.       while (MsgNode = MsgNode->ln_Succ)
  315.     Remove ((NODE *) MsgNode);
  316.     }
  317.  
  318.   DeletePort (port);
  319.  
  320.   if (CheckObject (&SysBase->PortList, obj))
  321.     RemPort (port);
  322.  
  323.   Permit ();
  324.  
  325.   return;
  326. }
  327.  
  328. static void
  329. RemoveFontSafely (TEXTFONT * tf)
  330. {
  331.   if (tf->tf_Flags & FPF_DISKFONT)
  332.     {
  333.       Forbid ();
  334.       CloseFont (tf);
  335.       Remove ((NODE *) tf);
  336.       Permit ();
  337.     }
  338.   else if (Question (SysWnd, "You attempt to remove a ROM-Font!\n"
  339.              "Remove this Font anyway?", YES))
  340.     {
  341.       Forbid ();
  342.       RemFont (tf);
  343.       Remove ((NODE *) tf);
  344.       Permit ();
  345.     }
  346.  
  347.   return;
  348. }
  349.  
  350.  /*
  351.   * KillTask() entfernt einen Task aund alle mit ihm verbundenen
  352.   * Windows, Screens und Ports. Alle anderen Resourcen können
  353.   * nicht mehr eindeutig zugeordnet werden
  354.   */
  355. static void
  356. KillTask (RSYS_Objid * obj)
  357. {
  358.   TASK *task = (TASK *) obj->address;
  359.   WINDOW *taskwin;
  360.   MSGPORT *port;
  361.  
  362.   if (Question (SysWnd, "Break signal failed!\n"
  363.         "Do you really want to kill the task harder?", YES))
  364.     if (CheckTask (obj))
  365.       {
  366.     Forbid ();
  367.  
  368.     Disable ();
  369.     Remove ((NODE *) task);
  370.     Enable ();
  371.  
  372.     if (taskwin = TaskWindow (task))
  373.       {
  374.         SCREEN *taskscr = NULL;
  375.         ULONG lock = LockIBase (NULL);
  376.  
  377.         if (taskwin->WScreen && (taskwin->WScreen->Flags & CUSTOMSCREEN))
  378.           taskscr = taskwin->WScreen;
  379.  
  380.         while (taskwin)
  381.           {
  382.         ClosingWindows (taskwin);
  383.         taskwin = TaskWindow (task);
  384.           }
  385.  
  386.         if (taskscr)
  387.           CloseScreen (taskscr);
  388.  
  389.         UnlockIBase (lock);
  390.       }
  391.  
  392.     while (port = TaskPort (obj->address))
  393.       RemovePortSafely (port, NULL);
  394.  
  395.     Disable ();
  396.     RemTask (task);
  397.     Enable ();
  398.  
  399.     Permit ();
  400.       }
  401.     else
  402.       ErrorHandle ("CheckTask()", TASK_ERR, FIND_FAIL, NO_KILL);
  403.  
  404.   return;
  405. }
  406.  
  407.  /*
  408.   * SignalTask() sendet eine Signal signal an den Task obj
  409.   */
  410. static void
  411. SignalTask (RSYS_Objid * obj, ULONG signal)
  412. {
  413.   TASK *task;
  414.  
  415.   if (task = FindTask ((UBYTE *) obj->fullname))
  416.     Signal (task, signal);
  417.   else
  418.     ErrorHandle (obj->fullname, TASK_ERR, FIND_FAIL, NO_KILL);
  419.  
  420.   return;
  421. }
  422.  
  423. static WINDOW *ChgPriWnd = NULL;
  424. static GADGET *ChgPriGList = NULL;
  425. static GADGET *ChgPriGadgets[5];
  426. static UWORD ChgPriLeft = 195;
  427. static UWORD ChgPriTop = 71;
  428. static UWORD ChgPriWidth = 228;
  429. static UWORD ChgPriHeight = 55;
  430. static UBYTE ChgPriWdt[100];    /*GMD */
  431.  
  432. static UWORD ChgPriGTypes[] =
  433. {
  434.   TEXT_KIND,
  435.   SLIDER_KIND,
  436.   BUTTON_KIND,
  437.   BUTTON_KIND,
  438.   INTEGER_KIND
  439. };
  440.  
  441. static NEWGADGET ChgPriNGad[] =
  442. {
  443.   52, 5, 169, 13, (UBYTE *) "Task", NULL, GD_TaskGad, PLACETEXT_LEFT, NULL, NULL,
  444.   52, 21, 129, 13, (UBYTE *) "Prio", NULL, GD_PrioGad, NG_HIGHLABEL, NULL, NULL,
  445.   8, 37, 69, 13, (UBYTE *) "Ok", NULL, GD_OkGad, PLACETEXT_IN, NULL, NULL,
  446.   156, 37, 65, 13, (UBYTE *) "Cancel", NULL, GD_CancelPriGad, PLACETEXT_IN, NULL, NULL,
  447.   88, 37, 57, 13, NULL, NULL, GD_PriIntGad, 0, NULL, NULL
  448. };
  449.  
  450. static ULONG *ChgPriGTags[] =
  451. {
  452.   (ULONG *) (GTTX_Text), (ULONG *) NULL,
  453.   (ULONG *) (GTTX_Border), (ULONG *) TRUE,
  454.   (ULONG *) (TAG_DONE),
  455.  
  456.   (ULONG *) (GTSL_Min), (ULONG *) (-128),
  457.   (ULONG *) (GTSL_Max), (ULONG *) 128,
  458.   (ULONG *) (GTSL_MaxLevelLen), (ULONG *) 4,
  459.   (ULONG *) (GTSL_LevelFormat), (ULONG *) "%4ld",
  460.   (ULONG *) (GTSL_LevelPlace), (ULONG *) (PLACETEXT_RIGHT),
  461.   (ULONG *) (PGA_Freedom), (ULONG *) LORIENT_HORIZ,
  462.   (ULONG *) (GA_Immediate), (ULONG *) TRUE,
  463.   (ULONG *) (GA_RelVerify), (ULONG *) TRUE,
  464.   (ULONG *) (TAG_DONE),
  465.  
  466.   (ULONG *) (TAG_DONE),
  467.  
  468.   (ULONG *) (TAG_DONE),
  469.  
  470.   (ULONG *) (GTIN_Number), (ULONG *) 0,
  471.   (ULONG *) (GTIN_MaxChars), (ULONG *) 5,
  472.   (ULONG *) (TAG_DONE)
  473. };
  474.  
  475.  /*
  476.   * OpenChgPriWindow() öffnet ein kleines Fenster, in
  477.   * dem man mit einem Slider die Priorität eines Tasks einstellen
  478.   * kann
  479.   */
  480. static int
  481. OpenChgPriWindow (void)
  482. {
  483.   NEWGADGET ng;
  484.   GADGET *g;
  485.   UWORD lc, tc;
  486.   UWORD wleft = ChgPriLeft, wtop = ChgPriTop, ww, wh;
  487.   int gl[] =
  488.   {GD_TaskGad - GD_TaskGad,
  489.    GD_PriIntGad - GD_TaskGad,
  490.    GD_PrioGad - GD_TaskGad};
  491.  
  492.   AdjustWindowDimensions (Scr, ChgPriLeft, ChgPriTop, ChgPriWidth, ChgPriHeight,
  493.               &wleft, &wtop, &ww, &wh);
  494.  
  495.   if (!(g = CreateContext (&ChgPriGList)))
  496.     return 1L;
  497.  
  498.   for (lc = 0, tc = 0; lc < ChgPri_CNT; lc++)
  499.     {
  500.       CopyMem ((char *) &ChgPriNGad[lc], (char *) &ng,
  501.            (long) sizeof (NEWGADGET));
  502.  
  503.       ng.ng_VisualInfo = VisualInfo;
  504.       ng.ng_TextAttr = Font;
  505.       ng.ng_LeftEdge = OffX + ComputeX (ng.ng_LeftEdge);
  506.       ng.ng_TopEdge = OffY + ComputeY (ng.ng_TopEdge);
  507.       ng.ng_Width = ComputeX (ng.ng_Width);
  508.       ng.ng_Height = ComputeY (ng.ng_Height);
  509.  
  510.       ChgPriGadgets[lc] = g = CreateGadgetA ((ULONG) ChgPriGTypes[lc], g, &ng, (TAGITEM *) & ChgPriGTags[tc]);
  511.  
  512.       makelabelvisible (ChgPriGadgets[lc]);
  513.  
  514.       while (ChgPriGTags[tc])
  515.     tc += 2;
  516.  
  517.       tc++;
  518.  
  519.       if (NOT g)
  520.     return 2L;
  521.     }
  522.  
  523.   strcpy (ChgPriWdt, get_vers (" - Change priority"));    /*GMD */
  524.  
  525.   if (!(ChgPriWnd = OpenWindowTags (NULL,
  526.                     WA_Left, wleft,
  527.                     WA_Top, wtop,
  528.                     WA_Width, ww,
  529.                     WA_Height, wh,
  530.                     WA_IDCMP, TEXTIDCMP |
  531.                     SLIDERIDCMP |
  532.                     BUTTONIDCMP |
  533.                     INTEGERIDCMP |
  534.                     IDCMP_CLOSEWINDOW |
  535.                     IDCMP_REFRESHWINDOW,
  536.                     WA_Flags, WFLG_DRAGBAR |
  537.                     WFLG_DEPTHGADGET |
  538.                     WFLG_CLOSEGADGET |
  539.                     WFLG_SMART_REFRESH |
  540.                     WFLG_ACTIVATE |
  541.                     WFLG_RMBTRAP,
  542.                     WA_Title, ChgPriWdt,
  543.                     WA_PubScreenFallBack, TRUE,
  544.                     WA_PubScreen, Scr,
  545.                     TAG_DONE)))
  546.     return 4L;
  547.  
  548.   RefreshRastPort (ChgPriWnd, ChgPriGadgets, gl, 3, FALSE, ChgPriGList);
  549.  
  550.   return (0L);
  551. }
  552.  
  553.  /*
  554.   * ChangePri() öffnet ein Fenster und managed das
  555.   * Priority-Handling für ein gewähltes Objekt obj
  556.   */
  557. static void
  558. ChangePri (RSYS_Objid * obj)
  559. {
  560.   TASK *task = (TASK *) obj->address;
  561.   int TaskPri = task->tc_Node.ln_Pri, OldPri = TaskPri;
  562.   INTUIMESSAGE *message;
  563.   ULONG class, code;
  564.   APTR object;
  565.   Flags.quit_cp = 0;
  566.  
  567.   if (OpenASysWindow (OpenChgPriWindow, NO_KILL))
  568.     {
  569.       LockMainWindow (WIN_LOCK);
  570.  
  571.       GT_SetGadgetAttrs (ChgPriGadgets[GD_TaskGad - GD_TaskGad], ChgPriWnd, NULL,
  572.              GTTX_Text, (UBYTE *) obj->fullname,
  573.              TAG_DONE);
  574.  
  575.       GT_SetGadgetAttrs (ChgPriGadgets[GD_PrioGad - GD_TaskGad], ChgPriWnd, NULL,
  576.              GTSL_Level, (UBYTE *) TaskPri,
  577.              TAG_DONE);
  578.  
  579.       GT_SetGadgetAttrs (ChgPriGadgets[GD_PriIntGad - GD_TaskGad], ChgPriWnd, NULL,
  580.              GTIN_Number, (UBYTE *) TaskPri,
  581.              TAG_DONE);
  582.  
  583.       do
  584.     {
  585.       Wait (1L << ChgPriWnd->UserPort->mp_SigBit);
  586.  
  587.       while ((message = (INTUIMESSAGE *)
  588.           GT_GetIMsg (ChgPriWnd->UserPort)) != NULL)
  589.         {
  590.           object = message->IAddress;
  591.           class = message->Class;
  592.           code = message->Code;
  593.  
  594.           GT_ReplyIMsg (message);
  595.  
  596.           switch (class)
  597.         {
  598.         case IDCMP_GADGETUP:
  599.           switch (((GADGET *) object)->GadgetID)
  600.             {
  601.             case GD_PrioGad:
  602.               TaskPri = (int) ((char) code);
  603.               GT_SetGadgetAttrs (ChgPriGadgets[GD_PriIntGad - GD_TaskGad], ChgPriWnd,
  604.                      NULL,
  605.                      GTIN_Number, (int) TaskPri,
  606.                      TAG_DONE);
  607.  
  608.               break;
  609.  
  610.             case GD_OkGad:
  611.               Flags.quit_cp = 1;
  612.               break;
  613.  
  614.             case GD_CancelPriGad:
  615.               TaskPri = OldPri;
  616.               Flags.quit_cp = 1;
  617.               break;
  618.  
  619.             case GD_PriIntGad:
  620.               TaskPri = (int) ((STRINGINFO *)
  621.                        (((GADGET *)
  622.                      object)->SpecialInfo))->LongInt;
  623.               if ((TaskPri < -128) || (TaskPri > 127))
  624.             GT_SetGadgetAttrs (ChgPriGadgets[GD_PriIntGad - GD_TaskGad],
  625.                        ChgPriWnd,
  626.                        NULL,
  627.                        GTIN_Number, OldPri,
  628.                        TAG_DONE);
  629.               else
  630.             GT_SetGadgetAttrs (ChgPriGadgets[GD_PrioGad - GD_TaskGad], ChgPriWnd,
  631.                        NULL,
  632.                        GTSL_Level, TaskPri,
  633.                        TAG_DONE);
  634.               break;
  635.             }
  636.  
  637.           break;
  638.  
  639.         case IDCMP_CLOSEWINDOW:
  640.           TaskPri = OldPri;
  641.           Flags.quit_cp = 1;
  642.           break;
  643.         }
  644.         }
  645.     }
  646.       while (NOT (Flags.quit_cp));
  647.  
  648.       CloseASysWindow (&ChgPriWnd, &ChgPriGList, NULL);
  649.  
  650.       if (CheckTask (obj) && (TaskPri != OldPri))
  651.     SetTaskPri (task, TaskPri);
  652.  
  653.       LockMainWindow (WIN_UNLOCK);
  654.     }
  655.  
  656.   return;
  657. }
  658.  
  659.  /*
  660.   * FlushLibrary() entfernt eine geschlossene Library aus
  661.   * dem System
  662.   */
  663. static void
  664. FlushLibrary (RSYS_Objid * obj)
  665. {
  666.   LIBRARY *result;
  667.  
  668.   if (Question (SysWnd, "Do you really want to remove the Library?", YES))
  669.     {
  670.       Forbid ();
  671.  
  672.       result = (LIBRARY *) FindName (&SysBase->LibList, (UBYTE *) obj->fullname);
  673.  
  674.       if (result && (result->lib_OpenCnt == 0))
  675.     RemLibrary (result);
  676.  
  677.       Permit ();
  678.  
  679.       if (!result)
  680.     ErrorHandle (obj->fullname, LIBRARY_ERR, FIND_FAIL, NO_KILL);
  681.     }
  682.  
  683.   return;
  684. }
  685.  
  686. static void
  687. ModifyTask (int TypeID, RSYS_Objid * obj)
  688. {
  689.   WORD sel;
  690.   ULONG signals[5] =
  691.   {
  692.     SIGBREAKF_CTRL_C, SIGBREAKF_CTRL_D, SIGBREAKF_CTRL_E, SIGBREAKF_CTRL_F,
  693.   (SIGBREAKF_CTRL_C | SIGBREAKF_CTRL_D | SIGBREAKF_CTRL_E | SIGBREAKF_CTRL_F)
  694.   };
  695.  
  696.   if (CheckTask (obj))
  697.     {
  698.       sel = DisplayTaskInfo (obj);
  699.  
  700.       switch (sel)
  701.     {
  702.     case 1:
  703.       if (obj->address != FindTask (NULL))
  704.         {
  705.           SignalTask (obj, signals[4]);
  706.  
  707.           Delay (SEC);
  708.  
  709.           if (CheckTask (obj))
  710.         KillTask (obj);
  711.           else
  712.         PrintInfo ("Break signal killed the task!", SPEAK, 2 * SEC);
  713.  
  714.           modified = TRUE;
  715.         }
  716.       else
  717.         ErrorHandle (obj->fullname, OWN_OBJECT_ERR, KILL_FAIL, NO_KILL);
  718.  
  719.       break;
  720.  
  721.     case 0:
  722.       break;
  723.  
  724.     case 2:
  725.     case 3:
  726.     case 4:
  727.     case 5:
  728.       SignalTask (obj, signals[sel - 2]);
  729.  
  730.       modified = TRUE;
  731.       break;
  732.  
  733.     case 6:
  734.       if (CheckTask (obj))
  735.         ChangePri (obj);
  736.       else
  737.         ErrorHandle (obj->fullname, TASK_ERR, FIND_FAIL, NO_KILL);
  738.  
  739.       modified = TRUE;
  740.       break;
  741.  
  742.     case 7:
  743.       modified = TRUE;
  744.       break;
  745.     }
  746.  
  747.       return;
  748.     }
  749.   else
  750.     ErrorHandle (obj->fullname, TASK_ERR, FIND_FAIL, NO_KILL);
  751.  
  752.   modified = TRUE;
  753.  
  754.   return;
  755. }
  756.  
  757. static void
  758. ModifyLibrary (int TypeID, RSYS_Objid * obj)
  759. {
  760.   if (CheckObject (&SysBase->LibList, obj))
  761.     {
  762.       if (DisplayLibraryInfo (obj))
  763.     FlushLibrary (obj);
  764.     }
  765.   else
  766.     ErrorHandle (obj->fullname, LIBRARY_ERR, FIND_FAIL, NO_KILL);
  767.  
  768.   modified = TRUE;
  769.  
  770.   return;
  771. }
  772.  
  773. static void
  774. DisplaySoftDevice (int TypeID, RSYS_Objid * obj)
  775. {
  776.   if (CheckObject (&SysBase->DeviceList, obj))
  777.     DisplaySoftDevInfo (obj);
  778.   else
  779.     {
  780.       ErrorHandle ("Soft Device", DEVICE_ERR, FIND_FAIL, NO_KILL);
  781.       modified = TRUE;
  782.     }
  783.  
  784.   return;
  785. }
  786.  
  787. static void
  788. DisplayResource (int TypeID, RSYS_Objid * obj)
  789. {
  790.   if (CheckObject (&SysBase->ResourceList, obj))
  791.     DisplayResourceInfo (obj);
  792.   else
  793.     {
  794.       ErrorHandle ("Resource", DEVICE_ERR, FIND_FAIL, NO_KILL);
  795.       modified = TRUE;
  796.     }
  797.  
  798.   return;
  799. }
  800.  
  801. static void
  802. ModifyPort (int TypeID, RSYS_Objid * obj)
  803. {
  804.   WORD sel;
  805.  
  806.   if (CheckObject (&SysBase->PortList, obj))
  807.     {
  808.       sel = DisplayPortInfo (obj);
  809.  
  810.       if (sel && ((obj->address == SysIdPort) || (obj->address == broker_mp) ||
  811.           (strstr (obj->fullname, "RSYS") != NULL)))
  812.     {
  813.       ErrorHandle (obj->fullname, OWN_OBJECT_ERR, MODIFY_FAIL, NO_KILL);
  814.       return;
  815.     }
  816.  
  817.       if (sel && Question (SysWnd, "Do you want to remove the Port?", YES))
  818.     {
  819.       if (CheckObject (&SysBase->PortList, obj))
  820.         RemovePortSafely (NULL, obj);
  821.       else
  822.         ErrorHandle (obj->fullname, PORT_ERR, FIND_FAIL, NO_KILL);
  823.  
  824.       modified = TRUE;
  825.     }
  826.     }
  827.   else
  828.     {
  829.       ErrorHandle (obj->fullname, PORT_ERR, FIND_FAIL, NO_KILL);
  830.       modified = TRUE;
  831.     }
  832.  
  833.   return;
  834. }
  835.  
  836. static void
  837. ModifyFont (int TypeID, RSYS_Objid * obj)
  838. {
  839.   WORD sel;
  840.   TEXTFONT *tf = (TEXTFONT *) obj->address;
  841.  
  842.   if (CheckObject (&GfxBase->TextFonts, obj))
  843.     sel = DisplayFontInfo (obj);
  844.   else
  845.     {
  846.       ErrorHandle (obj->fullname, FONT_ERR, FIND_FAIL, NO_KILL);
  847.       modified = TRUE;
  848.  
  849.       return;
  850.     }
  851.  
  852.   switch (sel)
  853.     {
  854.     case 1:
  855.       if (Question (SysWnd, "Do you want to close and remove this font?", YES))
  856.     {
  857.       if (CheckObject (&GfxBase->TextFonts, obj))
  858.         RemoveFontSafely (tf);
  859.       else
  860.         ErrorHandle (obj->fullname, FONT_ERR, FIND_FAIL, NO_KILL);
  861.  
  862.       modified = TRUE;
  863.     }
  864.       break;
  865.  
  866.     case 2:
  867.       if (CheckObject (&GfxBase->TextFonts, obj))
  868.     ShowFont ((TEXTFONT *) obj->address);
  869.       else
  870.     {
  871.       ErrorHandle (obj->fullname, FONT_ERR, FIND_FAIL, NO_KILL);
  872.       modified = TRUE;
  873.     }
  874.       break;
  875.     }
  876.  
  877.   return;
  878. }
  879.  
  880. static void
  881. ModifyWindow (int TypeID, RSYS_Objid * obj)
  882. {
  883.   WORD sel;
  884.  
  885.   sel = DisplayWindowInfo (obj);
  886.  
  887.   if (sel && ((WINDOW *) obj->address == SysWnd))
  888.     {
  889.       ErrorHandle ("Main window", OWN_OBJECT_ERR, MODIFY_FAIL, NO_KILL);
  890.       return;
  891.     }
  892.  
  893.   if (sel && Question (SysWnd, "Closing of Windows are very dangerous! The System \n"
  894.                "may be crash, when you close an active Window\n"
  895.                "Do you want to close the Window anyway?", YES))
  896.     ClosingWindows ((WINDOW *) obj->address);
  897.  
  898.   modified = TRUE;
  899.  
  900.   return;
  901. }
  902.  
  903. static void
  904. ModifyScreen (int TypeID, RSYS_Objid * obj)
  905. {
  906.   WORD sel;
  907.  
  908.   sel = DisplayScreenInfo (obj);
  909.  
  910.   if (sel && (((SCREEN *) obj->address == SysWnd->WScreen) ||
  911.           (((SCREEN *) obj->address)->Flags & WBENCHSCREEN)))
  912.     {
  913.       ErrorHandle ((char *) namebuffer, OWN_OBJECT_ERR, MODIFY_FAIL, NO_KILL);
  914.       return;
  915.     }
  916.  
  917.   if (sel && Question (SysWnd, "Closing of Screens are very dangerous! The System \n"
  918.                "may be crash, when you close an active Screen with\n"
  919.                "all associated windows!\n"
  920.         "Do you want to close the Screen and Windows anyway?", YES))
  921.     {
  922.       ClosingScreens ((SCREEN *) obj->address);
  923.       modified = TRUE;
  924.     }
  925.  
  926.   return;
  927. }
  928.  
  929. static void
  930. DisplayTreeDevice (int TypeID, RSYS_Objid * obj)
  931. {
  932.   if (DisplayDiskInfo (obj->fullname, TRUE))
  933.     PrintTree (obj);
  934.  
  935.   return;
  936. }
  937.  
  938. static void
  939. DisplayAllFonts (int TypeID, NODE * ClickedNode)
  940. {
  941.   TEXTFONT *tf;
  942.   TEXTATTR testfont;
  943.   int i, j;
  944.   char fontname[MAXSTRLEN], size[5];
  945.  
  946.   i = 0;
  947.  
  948.   while (ClickedNode->ln_Name[i] != ' ')
  949.     {
  950.       fontname[i] = ClickedNode->ln_Name[i];
  951.       i++;
  952.     }
  953.  
  954.   fontname[i] = STRINGEND;
  955.  
  956.   testfont.ta_Name = (UBYTE *) fontname;
  957.  
  958.   while (ClickedNode->ln_Name[i] == ' ')
  959.     i++;
  960.   while (ClickedNode->ln_Name[i] != ' ')
  961.     i++;
  962.   while (ClickedNode->ln_Name[i] == ' ')
  963.     i++;
  964.  
  965.   j = 0;
  966.   while (ClickedNode->ln_Name[i] != ' ')
  967.     {
  968.       size[j] = ClickedNode->ln_Name[i];
  969.       i++;
  970.       j++;
  971.     }
  972.  
  973.   size[j] = STRINGEND;
  974.  
  975.   testfont.ta_YSize = atoi (size);
  976.   testfont.ta_Flags = 0;
  977.   testfont.ta_Style = 0;
  978.  
  979.   tf = OpenDiskFont (&testfont);
  980.   if (tf)
  981.     {
  982.       ShowFont (tf);
  983.       CloseFont (tf);
  984.     }
  985.  
  986.   return;
  987. }
  988.  
  989. static void
  990. ModifyVolumeLock (int TypeID, RSYS_Objid * obj)
  991. {
  992.   if (DisplayLockInfo (obj) && Question (SysWnd, "Unlocking is very dangerous!\n"
  993.                 "Do you really want to unlock this lock?", YES))
  994.     {
  995.       Forbid ();
  996.       UnLock ((BPTR) obj->address);
  997.       Permit ();
  998.  
  999.       modified = TRUE;
  1000.     }
  1001.  
  1002.   return;
  1003. }
  1004.  
  1005.  /*
  1006.   * ModifyObject() prüft ob ein Element einer Liste im Hauptfenster
  1007.   * modifiziert oder angezeigt werden kann und ruft die entsprechenden
  1008.   * Routinen auf
  1009.   */
  1010. void
  1011. ModifyObject (int TypeID, ULONG code)
  1012. {
  1013.   NODE *ClickedNode;
  1014.   RSYS_Objid *obj;
  1015.   char out[BUFSIZE]
  1016.  
  1017.     DPOS;
  1018.  
  1019.   modified = FALSE;
  1020.  
  1021.   sprintf (out, "Modify %s", EntryAttr[TypeID].ea_type);
  1022.   PrintInfo (out, SPEAK, 0);
  1023.  
  1024.   if (NOT (ClickedNode = GetNode (&ListeLVList, code)))
  1025.     {
  1026.       ErrorHandle ("No Object found ???", LIST_NODE_ERR, FIND_FAIL, NO_KILL);
  1027.       return;
  1028.     }
  1029.  
  1030.   obj = &((RSYS_ScrollEntry *) ClickedNode)->se_obj_id;
  1031.  
  1032.   switch (TypeID)
  1033.     {
  1034.     case TASKS:
  1035.       ModifyTask (TypeID, obj);
  1036.       break;
  1037.  
  1038.     case LIBRARIES:
  1039.       ModifyLibrary (TypeID, obj);
  1040.       break;
  1041.  
  1042.     case SYSSOFTDEV:
  1043.       DisplaySoftDevice (TypeID, obj);
  1044.       break;
  1045.  
  1046.     case RESOURCES:
  1047.       DisplayResource (TypeID, obj);
  1048.       break;
  1049.  
  1050.     case PORTS:
  1051.       ModifyPort (TypeID, obj);
  1052.       break;
  1053.  
  1054.     case FONTS:
  1055.       ModifyFont (TypeID, obj);
  1056.       break;
  1057.  
  1058.     case WINDOWS:
  1059.       ModifyWindow (TypeID, obj);
  1060.       break;
  1061.  
  1062.     case SCREENS:
  1063.       ModifyScreen (TypeID, obj);
  1064.       break;
  1065.  
  1066.     case ASSIGNS:
  1067.     case VOLUMES:
  1068.       DisplayTreeDevice (TypeID, obj);
  1069.       break;
  1070.  
  1071.     case ALLFONTS:
  1072.       DisplayAllFonts (TypeID, ClickedNode);
  1073.       break;
  1074.  
  1075.     case VOLLOCKS:
  1076.       ModifyVolumeLock (TypeID, obj);
  1077.       break;
  1078.  
  1079.     case SYSINFO:
  1080.     case HARDWARE:
  1081.     case PREFS:
  1082.     case ENVVARS:
  1083.     case SYSVECTORS:
  1084.     case E_PRINTERDATA:
  1085.     case LIBRARYOFFS:
  1086.       DisplayBeep (NULL);
  1087.       break;
  1088.  
  1089.     case MEMORY:
  1090.       if (code < 3)
  1091.     DisplayBeep (NULL);
  1092.       else
  1093.     Monitor (obj, ((RSYS_ScrollEntry *) ClickedNode)->se_Entry);
  1094.       break;
  1095.  
  1096.     default:
  1097.       Monitor (obj, ((RSYS_ScrollEntry *) ClickedNode)->se_Entry);
  1098.       break;
  1099.     }
  1100.  
  1101.   if (modified)
  1102.     RefreshList (LastID);
  1103.  
  1104.   PrintStatistics ();
  1105.  
  1106.   return;
  1107. }
  1108.